iT邦幫忙

DAY 26
3

Android 學習手札系列 第 26

Day 26 - Android - 第二個世界元素

  • 分享至 

  • xImage
  •  

在「Day 5 - Android - 世界的元素裡有提到,Android 的世界中有四個主要元素,而我們平常介紹的一直都是最常用的 元素-Activity,而今天要為各位帶來第二個元素:「Content Providers」

註:本來於昨日的最後說到,今天介紹如何自定 ListView 的介面,因為圖片的部份尚未準備好,所以今天就先為各位帶來這篇,抱歉~
內容提供者(Content Providers)廣義來說,可以泛指所有存放在硬體中的資料集,而資料來源可能是文件檔案、SQLite…等等,而今天要介紹一個最容易使用「SharedPreferences」。這也是 Android 世界裡所提供的一個簡易又方便的方法,他供我們可以用 key-value 的方式,將基本型別的資料存放在硬體上面。

而他的使用也是分成三個簡單的部份即可
一、宣告
二、動作
三、清除

一、宣告
宣告的方式相當容易,在要使用(不論是要做新增/修改/刪除的哪個動作都要先宣告

SharedPreferences content = getSharedPreferences("CONTENT_NAME", MODE);

就是這樣而已,在一開始的宣告就先給予這個 SharedPreferences 名稱(CONTENT_NAME),以及一個狀態(MODE),前者自行定義即可,後者[官方](http://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String, int))提供了四種模式(MODE)來讓我們對這個 SharedPreferences 定義他的被存取權限(範圍)!

//私有權限,只有自己這個 APP 可以使用
MODE_PRIVATE
//開放給其他 APP 只能讀取的權限
MODE_WORLD_READABLE
//開放讓其他 APP 能夠存取
MODE_WORLD_WRITEABLE
//同時讓多個 APP 可以存取
MODE_MULTI_PROCESS

二、動作
相信大家都能猜到三個基本動作~新增/修改/刪除元件,另外還有一個是讀取,而前面的三個基本動作在程式指令就是一個很簡單的結構:data.edit().動作.commit();

//新增或修改整數
data.edit().putInt("COUNT", 3).commit();
//新增或修改字串
data.edit().putString("NAME", "Moogle").commit();

//刪除元素
data.edit().remove("COUNT").commit();

他還可以連續動作

data.edit()
    .putInt("COUNT", 3).putString("NAME", "Moogle")
    .remove("COUNT").remove("NAME")
    .commit();

上面這個例子只是單純搞笑,別當真,真的這麼寫是沒意義的XD
另外,他的新增跟修改都是同一個指令 putTheType(KEY, VALUE),當該 KEY 是存在的話,就是修改;反之,則新增。

另外一個動作是讀取

data.getInt("COUNT", 0);

就是直接用getTheType的方式,第一個參數仍是 Key,而第二個參數要給同型別的 VALUE,用意在當讓 Key 的資料是不存在的話,就直接給這個預設值,以避免錯誤的發生,相當體貼的設計,對吧沙發

三、清除

data.edit().clear().commit()

可能有人會問,上面不是有個remove了嗎?是的,沒錯,那個是針對 SharedPreferences 裡的元素來"移除",所以這邊官方的指令才會用 clear(清除)這個 SharedPreferences呀!別忘了~咱們現在介紹的是 Content Providers 這個元素,就算是在關掉這個 APP 的同時,資料保留在我們硬體裡的!並不會因為 APP 的關閉就被清除哦~除非是這個 APP 被移除了,好饒口的一段XD

這個元素自然是為了讓我們能夠活躍在 Android 的世界中,而這個元素多伴都是在讓 Activity 更加方便地來做一些「設定」,是的!設定!所以在硬梆梆的使用介紹後,來看看如何將之應用在之前的範例之中。

今天的範例依舊是延續著昨天的程式碼,請將之在新增為一個新的專案「Day26_ContentProviders」,今天要再加入一位新的成員「Moogle4」,我們請他來為我們做"語系"的設定,這個設定在做什麼用呢?若是各位跟在下一樣都是用模擬器,而且沒有去動過模擬器的語系設定的話,那他的預設是在values-en-rUS,而我們在之前也建立了這麼一個語系目錄,所以在進入到 ChocoboActivity 時,下拉選單的並不是顯示在第一個選項「正體中文」而是跟預設環境一樣的美區英文,也不是預設目錄。

而這個 Moogle4 的介面(activity_moogle4.xml)長這樣

就是三個語系的單選(RadioButton)以及一個按鈕。再來是程式的部份,setView()的部份

private void setView() {
    mRdgLanguage = (RadioGroup) findViewById(R.id.rdg_setting_language);
    mBtnSetting = (Button) findViewById(R.id.btn_setting_ok);
    mBtnSetting.setOnClickListener(btnClick);
}

按鈕的偵聽式

private View.OnClickListener btnClick = 
        new View.OnClickListener() {
    public void onClick(View v) {
        /* 取得語系選擇值 */
        int lang = 0;
        switch(mRdgLanguage.getCheckedRadioButtonId()){
	case R.id.rdo_tw:
            lang = 1;
            break;
	case R.id.rdo_jp:
            lang = 2;
            break;
	case R.id.rdo_us:
            lang = 3;
            break;
        }        
        /* 宣告,SharedPreferences
         * 第一個參數:key的部份請自行定義,
         * 第二個參數:MODE_PRIVATE,設為私有,讓我們自己這個app可以使用即可
         */
        SharedPreferences preferences = getSharedPreferences("MOSIL", MODE_PRIVATE);
        preferences.edit().putInt("LANG", lang).commit();
        
        /* 設定完成就直接離開本頁 */
        finish();
    }
};

到這邊就完成 Moogle4 的動作嘍!再來怎麼串連到 Moogle4 來呢?很簡單,只要在 menut 目錄裡的 moogle.xml 追加一個選單項目即可

<item android:id="@+id/menu_setting_language"
        android:title="@string/menu_language" />

拉著到 MoogleActivity 的 onOptionsItemSelected 區段再追加一個動作

case R.id.menu_setting_language:
	Intent intentToSetting = new Intent(this, Moogle4Activity.class);
	startActivity(intentToSetting);
	break;

到這邊,我們先執行看看,畫面以及動作是否依我們所想的去進行

嗯!多了一個「設定語系」選單項目了,點進去就能看到下面這個畫面啦

再來就剩最後一個動作了,到 ChocoboActivity 裡的 setView() 一開始追加這一段

//私有權限,只有自己這個 APP 可以使用
MODE_PRIVATE
//開放給其他 APP 只能讀取的權限
MODE_WORLD_READABLE
//開放讓其他 APP 能夠存取
MODE_WORLD_WRITEABLE
//同時讓多個 APP 可以存取
MODE_MULTI_PROCESS

0

這麼一來,到 Chocobo 就不會有問題嘍

再來,一個小作業,請各位嘗試做做看,我們現在的 app 還有一個問題
就是到語系設定頁時,我們的單選元件沒法忠實地呈現我們現在 SharePreferences 的設定,這是其一。
其二,請各位嘗試著將「Day 24 - Android - 溝通」的範例中原本 Moogle2 回傳給 Chocobo 呈現的那段文字,用今天的方式,使之回到 Moogle 時,可以讓該文字呈現到「傳遞內容」的輸入框中哦!

今天除了第二個元素外,還同時讓各位複習了 menu 以及 radiogroup 的使用,不知道各位是否能更有印象了呢?

Day 25 - Android - 簡介與列表《 》Day 27 - Android - 自我


上一篇
Day 25 - Android - 簡介與列表
下一篇
Day 27 - Android - 自我
系列文
Android 學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
mosil
iT邦新手 4 級 ‧ 2012-10-21 00:02:03

暈
這兩天是怎麼回事啊抗議
進入編輯時的最後一塊程式內容都是正確的,可是真的顯示時都是錯的翻桌

只好在這裡補上了忙

&lt;pre class="c" name="code">
private void setView() {
        mPreferences = getSharedPreferences("MOSIL", MODE_PRIVATE);
        int lang = mPreferences.getInt("LANG", 0);
        //取得系統資源
        Resources resource = getResources();
        //取得資源設定
        Configuration conf = resource.getConfiguration();
        switch(lang){
            case 1:
                conf.locale = Locale.TAIWAN;
                break;
            case 2:
                conf.locale = Locale.JAPAN;
                break;
            case 0:
            case 3:
            default:
                conf.locale = Locale.US;
                break;
        }
        DisplayMetrics dm =resource.getDisplayMetrics();
        //更新
        resource.updateConfiguration(conf, dm);
...

我要留言

立即登入留言